﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BussinesLayer.Clases;
using CustomControl;
using DTO.Clases;
using Utilities;

namespace Aplicacion.Inventario.Consulta
{
    public partial class FrmConsultaInventario : Form
    {
        #region Atributos

        private BussinesInventario miBussinesInventario;

        private ToolTip miToolTip;

        private bool ExtendForms { set; get; }

        private int Iteracion;

        private int RowInventario;

        private int RowMaxInventario;

        private long Pages;

        private long TotalRows;

        private int CurrentPage;

        private string CodigoActual;

        private string NombreActual;

        private string CategoriaActual;

        #endregion

        public FrmConsultaInventario()
        {
            miBussinesInventario = new BussinesInventario();
            miToolTip = new ToolTip();
            RowMaxInventario = 16;
            InitializeComponent();
        }

        private void FrmConsultaInventario_Load(object sender, EventArgs e)
        {
            CargarUtilidades();
            dgvInventario.AutoGenerateColumns = false;
            CompletaEventos.CompletaEditProveedor += 
                new CompletaEventos.CompletaAccionEditProveedor(CompletaEventos_Completo);
            CompletaEventos.Completam += 
                new CompletaEventos.CompletaAccionm(CompletaEventosm_Completo);
        }

        private void FrmConsultaInventario_KeyDown(object sender, KeyEventArgs e)
        {
            var criterio = (int)cbCriterio.SelectedValue;
            if (e.KeyData == Keys.F4)
            {
                txtCodigoNombre.Focus();
                btnBuscar_Click(this.btnBuscar, new EventArgs());
            }
        }

        private void tsBtnListarTodos_Click(object sender, EventArgs e)
        {
            RowInventario = 0;
            Iteracion = 1;
            CurrentPage = 1;
            try
            {
                dgvInventario.DataSource =
                    miBussinesInventario.ConsultaInventario(RowInventario, RowMaxInventario);
                TotalRows = miBussinesInventario.GetRowsConsultaInventario();
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void tsBtnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cbCriterio_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (Convert.ToInt32(cbCriterio.SelectedValue) == 1)
            {
                cbCriterio1.Enabled = true;
                miToolTip.SetToolTip(btnBuscar, "Buscar Producto [F4]");
            }
            else
            {
                cbCriterio1.SelectedValue = 1;
                cbCriterio1.Enabled = false;
                miToolTip.SetToolTip(btnBuscar, "Buscar Categoria [F4]");
            }
        }

        private void txtCodigoNombre_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                btnConsultar_Click(this.btnConsultar, new EventArgs());
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            var criterio = (int)cbCriterio.SelectedValue;
            if (criterio == 1)
            {
                if (!ExtendForms)
                {
                    var frmProducto = new Producto.FrmIngresarProducto();
                    frmProducto.MdiParent = this.MdiParent;
                    frmProducto.tabControlProducto.SelectedIndex = 1;
                    frmProducto.Edit = true;
                    frmProducto.Extencion = true;
                    ExtendForms = true;
                    frmProducto.Show();
                }
            }
            else
            {
                if (!ExtendForms)
                {
                    var frmCategoria = new Categoria.FrmCategoria();
                    frmCategoria.MdiParent = this.MdiParent;
                    frmCategoria.Extencion = true;
                    frmCategoria.TblCategoria.SelectedIndex = 1;
                    ExtendForms = true;
                    frmCategoria.Show();
                }
            }
        }

        private void btnConsultar_Click(object sender, EventArgs e)
        {
            var criterio = (int)cbCriterio.SelectedValue;
            var criterio1 = (int)cbCriterio1.SelectedValue;
            RowInventario = 0;
            CurrentPage = 1;
            if (criterio == 1 && criterio1 == 1)
            {
                Iteracion = 2;
                CodigoActual = txtCodigoNombre.Text;
                try
                {
                    dgvInventario.DataSource = miBussinesInventario.ConsultaInventario
                        (txtCodigoNombre.Text, RowInventario, RowMaxInventario);
                    TotalRows = miBussinesInventario.GetRowsConsultaInventario(txtCodigoNombre.Text);
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }

            }
            else
            {
                if (criterio == 1 && criterio1 == 2)
                {
                    Iteracion = 3;
                    NombreActual = txtCodigoNombre.Text;
                    try
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaInventarioNombre
                            (txtCodigoNombre.Text, RowInventario, RowMaxInventario);
                        TotalRows = miBussinesInventario.GetRowsConsultaInventarioNombre(txtCodigoNombre.Text);
                    }
                    catch (Exception ex)
                    {
                        OptionPane.MessageError(ex.Message);
                    }
                }
                else
                {
                    Iteracion = 4;
                    CategoriaActual = txtCodigoNombre.Text;
                    try
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaInventarioCategoria
                            (txtCodigoNombre.Text, RowInventario, RowMaxInventario);
                        TotalRows = miBussinesInventario.GetRowsConsultaInventarioCategoria(txtCodigoNombre.Text);
                    }
                    catch (Exception ex)
                    {
                        OptionPane.MessageError(ex.Message);
                    }
                }
            }
            CalcularPaginas();
        }

        private void btnInicio_Click(object sender, EventArgs e)
        {
            if (CurrentPage > 1)
            {
                var page = CurrentPage;
                for (int i = page; i > 1; i--)
                {
                    RowInventario = RowInventario - RowMaxInventario;
                    CurrentPage--;
                }
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(RowInventario, RowMaxInventario);
                                break;
                            }
                        case 2:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(CodigoActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 3:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioNombre(NombreActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 4:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioCategoria(CategoriaActual, RowInventario, RowMaxInventario);
                                break;
                            }
                    }
                    lblStatusInventario.Text = CurrentPage + " / " + Pages;
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            if (CurrentPage > 1)
            {
                RowInventario = RowInventario - RowMaxInventario;
                if (RowInventario <= 0)
                    RowInventario = 0;
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(RowInventario, RowMaxInventario);
                                break;
                            }
                        case 2:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(CodigoActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 3:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioNombre(NombreActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 4:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioCategoria(CategoriaActual, RowInventario, RowMaxInventario);
                                break;
                            }
                    }
                    CurrentPage--;
                    lblStatusInventario.Text = CurrentPage + " / " + Pages;
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            if (CurrentPage < Pages)
            {
                RowInventario = RowInventario + RowMaxInventario;
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(RowInventario, RowMaxInventario);
                                break;
                            }
                        case 2:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(CodigoActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 3:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioNombre(NombreActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 4:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioCategoria(CategoriaActual, RowInventario, RowMaxInventario);
                                break;
                            }
                    }
                    CurrentPage++;
                    lblStatusInventario.Text = CurrentPage + " / " + Pages;
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void btnFin_Click(object sender, EventArgs e)
        {
            if (CurrentPage < Pages)
            {
                var page = CurrentPage;
                for (int i = page; i < Pages; i++)
                {
                    RowInventario = RowInventario + RowMaxInventario;
                    CurrentPage++;
                }
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(RowInventario, RowMaxInventario);
                                break;
                            }
                        case 2:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventario(CodigoActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 3:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioNombre(NombreActual, RowInventario, RowMaxInventario);
                                break;
                            }
                        case 4:
                            {
                                dgvInventario.DataSource = miBussinesInventario.
                                    ConsultaInventarioCategoria(CategoriaActual, RowInventario, RowMaxInventario);
                                break;
                            }
                    }
                    lblStatusInventario.Text = CurrentPage + " / " + Pages;
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void CargarUtilidades()
        {
            miToolTip.SetToolTip(btnBuscar, "Buscar Producto [F4].");
            miToolTip.SetToolTip(btnConsultar, "Realizar Consulta.");
            var lst = new List<Inventario.Producto.Criterio>();
            lst.Add(new Producto.Criterio
            {
                Id = 1,
                Nombre = "Producto"
            });
            lst.Add(new Producto.Criterio
            {
                Id = 2,
                Nombre = "Categoria"
            });
            cbCriterio.DataSource = lst;

            lst = new List<Producto.Criterio>();
            lst.Add(new Producto.Criterio
            {
                Id = 1,
                Nombre = "Codigo"
            });

            lst.Add(new Producto.Criterio
            {
                Id = 2,
                Nombre = "Contenga Nombre"
            });
            cbCriterio1.DataSource = lst;
        }

        /// <summary>
        /// Calcula y muestra el número de paginas devueltas en la consulta.
        /// </summary>
        private void CalcularPaginas()
        {
            Pages = TotalRows / RowMaxInventario;
            if (TotalRows % RowMaxInventario != 0)
                Pages++;
            if (CurrentPage > Pages)
                CurrentPage = 0;
            lblStatusInventario.Text = CurrentPage + " / " + Pages;
        }

        void CompletaEventos_Completo(CompletaArgumentosDeEventoEditProveedor args)
        {
            try
            {
                ExtendForms = Convert.ToBoolean(args.MiObjeto);
            }
            catch { }

            try
            {
                var producto_ = (DTO.Clases.Producto)args.MiObjeto;
                txtCodigoNombre.Text = producto_.CodigoInternoProducto;
                ExtendForms = false;
                btnConsultar.Focus();
            }
            catch { }
        }

        void CompletaEventosm_Completo(CompletaArgumentosDeEventom args)
        {
            try
            {
                ExtendForms = Convert.ToBoolean(args.MiMarca);
            }
            catch { }

            try
            {
                var categoria_ = (DTO.Clases.Categoria)args.MiMarca;
                txtCodigoNombre.Text = categoria_.CodigoCategoria;
                ExtendForms = false;
                btnConsultar.Focus();
            }
            catch { }
        }

    }
}